﻿/*=====================================================================
 * Arquivo:	TFCException.cs
 * 
 * Sumário: Esta classe define a base de todas as exceções da 
 *          TFC.NET.
 * 
 * Autor:		Siddhartha Argollo
 * 
 * Copyright (C) TecnoTRENDS. Todos os direitos reservados.
 =====================================================================*/
using System;
using System.Runtime.Serialization;

namespace DaCredito
{
    /// <summary>
    /// Classe base de todas as exceções da TFC.NET.
    /// </summary>
    [Serializable]
    public class TFCException : Exception
    {
        // Guarda os parâmetros para a formatação da mensagem
        private object[] ioParams;

        /// <summary>
        /// Instancia uma exceção sem mensagem.
        /// </summary>
        public TFCException()
        {
        }

        /// <summary>
        /// Instancia a exceção com uma mensagem sem parâmetros
        /// de formatação.
        /// </summary>
        /// <param name="asMessage">Mensagem da execeção.</param>
        public TFCException(string asMessage)
            : base(asMessage)
        {
        }

        /// <summary>
        /// Instancia a exceção com uma mensagem sem parâmetros
        /// de formatação.
        /// </summary>
        /// <param name="asMessage">Mensagem da execeção.</param>
        /// <param name="aoInner">Exceção causadora.</param>
        public TFCException(string asMessage, Exception aoInner)
            : base(asMessage, aoInner)
        {
        }

        /// <summary>
        /// Instancia a exceção com uma mensagem com parâmetros
        /// de formatação.
        /// </summary>
        /// <param name="asMessage">Mensagem da execeção.</param>
        /// <param name="aoParams">Parâmetros de formatação.</param>
        public TFCException(string asMessage, object[] aoParams)
            : base(asMessage)
        {
            this.ioParams = aoParams;
        }

        /// <summary>
        /// Instancia a exceção com uma mensagem com parâmetros
        /// de formatação.
        /// </summary>
        /// <param name="asMessage">Mensagem da execeção.</param>
        /// <param name="aoParams">Parâmetros de formatação.</param>
        /// <param name="aoInner">Exceção causadora.</param>
        public TFCException(string asMessage, object[] aoParams,
          Exception aoInner)
            : base(asMessage, aoInner)
        {
            this.ioParams = aoParams;
        }

        /// <summary>
        /// Construtor usado para serialização do objeto.
        /// </summary>
        /// <param name="info"></param>
        /// <param name="context"></param>
        protected TFCException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            this.ioParams = (object[])info.GetValue("TFCException.Params", typeof(object[]));
        }

        /// <summary>
        /// Retorna a exceção raiz de uma cadeia de exceções.
        /// </summary>
        /// <param name="loError"></param>
        /// <returns>A exceção raiz de uma cadeia de exceções.</returns>
        public static Exception GetRootException(Exception loError)
        {
            while (loError.InnerException != null)
                loError = loError.InnerException;
            return loError;
        }

        /// <summary>
        /// Retorna a mensagem da exceção, formatada com os parâmetros recebidos.
        /// </summary>
        public override string Message
        {
            get
            {
                if (this.ioParams != null)
                    return string.Format(base.Message, this.ioParams);
                else
                    return base.Message;
            }
        }

        /// <summary>
        /// Parâmetros para formatação da mensagem.
        /// </summary>
        public object[] Params
        {
            get { return this.ioParams; }
        }

        /// <summary>
        /// Retorna o identificador da mensagem da exceção.
        /// </summary>
        public string MessageId
        {
            get { return base.Message; }
        }

        /// <summary>
        /// Serializa os atributos da classe.
        /// </summary>
        /// <param name="info"></param>
        /// <param name="context"></param>
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("TFCException.Params", this.ioParams);
            base.GetObjectData(info, context);
        }

    } // TFCException

} // Trends.TFC.Common
